<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
      ------分数注意事项-----
      本次测试满分为100(最多100分), 有4道加分题; 答案不够完整或者有错误当题0分处理; 

      ------分数处理-----
      (0-60]: 不及格, 处理: 提供第二份不同试卷晚自习的时候重新考试, 并在第二天晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (60-75]: 良良, 处理: 晚自习时间单独进行测试题提问(大部分都回答不上则采用手抄试卷方案);

      (75-90]: 良好, 处理: 放你一马, 好好复习;

      (90-100]: 优秀, 处理: 好好好, 继续保持;
      */

      // 1.JS延迟加载的方式有哪些？（5）
      /*
      1.setTimeout 延时定时器 在指定的毫秒数内执行一次函数
      2.clearTimeout、clearInterval 清除定时器
      3.setInterval 重复定时器
      */

      // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）

      // 4.如何进行数据类型的判断？（5）
      /*
      有三种判断方法
      1.typeof 
      2. instanceof
      3.Object.prototype.toString.call()
      */
      // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
      /*
      含义上的区别：null表示的是一个没有任何对象值的空引用。而undefined表示的是变量没有被赋值，或者对象没有某个属性。
      类型上的区别：null是一个特殊的类型，它只有一个值，就是null。而undefined则是JS中最基础的类型，它的值是undefined。
      当变量没有被赋值，或者对象没有某个属性，或者函数没有返回值时都返回undefined
      */
      // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
      /*
      null == undefined表示它们都是表示“没有值”或“不存在”，所以相等。但是，null === undefined，它们不相等，因为===还会检查值的类型。
      */
      // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      /*
      break 中断整个流程控制
      continue 跳出当前符合条件的流程, 继续下一个流程
      */
      // 8.如何判断字符串内是否包含指定字符？（5）
      /*
      可以通过indexOf或lastIndexOf进行查找，查找不到则返回-1
      */

      // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
      /*
      concat(a1, a2,..) 合并数组，不会改变原数组
      join() 将数组转换为字符串，不会改变原数组
      slice() 切片 不会改变原数组
      splice() 替换/删除 会改变原数组
      indexOf() 从左往右查找  不会改变原数组
      lastIndexOf() 从右往左查找  不会改变原数组
      reverse() 翻转数组  会改变原数组
      push() 数组末尾添加 不会改变原数组
      pop()  数组末尾删除  会改变原数组
      shift() 数组首部删除  会改变原数组
      unshift() 数组首部添加  会改变原数组
      */
      // 10. 请写出下面语句的输出结果：（5）
      // let bar = true, number = 0;
      // console.log(bar + 0);  1
      // console.log(bar + "xyz");  truexyz
      // console.log(bar + true); 2
      // console.log(+true);  1
      // console.log(!'bluej');  false
      // console.log(number++);  0
      // console.log(++number);  2
      // console.log(number);   2

      // 11. 根据用户输入时间实现倒计时，输入时间格式错误时要有错误提示（5）
      // window.prompt("请输入目标时间");
      // let t = new Date(window.prompt("请输入目标时间")).getTime();

      // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
      // 质数也叫素数是指在大于1的自然数中，除了1和它本身以外不再有其他因数的自然数，不能被任何整数整除的数。

      // 13.把下面数组成员排序打乱；（5）
      let arr13 = [10, 20, 30, 40, 50, 60];
      let newArr2 = []; // 打乱之后的数组
      while (arr13.length) {
        let sum13 = Math.floor(Math.random() * arr13.length);
        newArr2.push(arr13[sum13]);
        arr13.splice(sum13, 1);
      }
      console.log(newArr2);
      // 14. 将多个数组进行去重合并；（10）
      let arr140 = [1, 2, 3],
        arr141 = [2, 3, 4, 5];
      let sum14 = Array.from(new Set(arr140.concat(arr141)));
      console.log(sum14);

      // 15. 找出数组 arr=[1, 2, 3, "a", 4, "a", 2, 4, "a"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）

      let arr15 = [1, 2, 3, 'a', 4, 'a', 2, 4, 'a'];
      let obj = {};
      for (let i = 0; i < arr15.length; i++) {
        if (obj[arr15[i]]) {
          obj[arr15[i]]++;
        } else {
          obj[arr15[i]] = 1;
        }
      }
      let sum15 = Object.entries(obj)
        .filter(([key, value]) => value > 1)
        .map(([key, value]) => key);
      console.log(sum15);
      // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      let arr16 = [
        {
          name: '111',
          sex: 'boy',
          age: 18,
          count: 20,
        },
        {
          name: '222',
          sex: 'girl',
          age: 17,
          count: 30,
        },
        {
          name: '333',
          sex: 'boy',
          age: 16,
          count: 40,
        },
        {
          name: '444',
          sex: 'girl',
          age: 15,
          count: 50,
        },
        {
          name: '555',
          sex: 'boy',
          age: 20,
          count: 60,
        },
        {
          name: '666',
          sex: 'girl',
          age: 13,
          count: 70,
        },
        {
          name: '777',
          sex: 'boy',
          age: 14,
          count: 80,
        },
      ];
      let fn = arr16.filter(function (v, index) {
        if (v.age < 17) {
          return v;
        }
      });
      console.log(fn);

      // Math.pow(item.count, 2);

      // 17. 实现一个深克隆函数 (加分题 5)
      function deepClone(obj) {
        if (obj === null || typeof obj !== 'object') {
          return obj;
        }
        let clone = Array.isArray(obj) ? [] : {};
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key]);
          }
        }

        return clone;
      }
      // 18. 实现一个数组的reduce方法 (加分题 5)
      let arr18 = [1, 2, 3, 4, 5, 6, 7];
      let sum18 = 0;
      sum18 = arr18.reduce(function (total, current) {
        total += current;
        return (total += current);
      }, 0);
      console.log('累加值', sum18);

      // 19. 写出强制转换的方法有哪些 (加分题 5)
      let sum19 = 123;
      console.log(String(sum19)); //强制转换为字符串类型
      console.log(Number(sum19)); //强制转换为数据类型
      console.log(Boolean(sum19)); //强制转换为布尔值类型
      console.log(Boolean(!sum19));

      // 20. 如何判断一个对象是否为空对象的3种方法 (加分题 5)
      let arr20 = ['1', '2', '3', ' '];
      function fn20(arr) {
        for (let v of arr) {
          if (v == ' ') {
            return true;
          }
        }
        return false;
      }
      console.log(fn20(arr20));

      for (let i = 0; i < arr20.length; i++) {
        if (arr20[i] == ' ') {
          console.log(true);
        }
      }

      let flag20 = true;
      flag20 = arr20.some(function (v) {
        return v == ' ';
      });
      console.log(flag20);
    </script>
  </body>
</html>
